[HVM] Don't count "missed ticks" on one-shot timers.
authorTim Deegan <Tim.Deegan@xensource.com>
Mon, 24 Sep 2007 12:44:29 +0000 (13:44 +0100)
committerTim Deegan <Tim.Deegan@xensource.com>
Mon, 24 Sep 2007 12:44:29 +0000 (13:44 +0100)
It's not clear what it would mean, and it leads to division by zero.
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
xen/arch/x86/hvm/vpt.c

index 8213005de27cadc5a3ec5224526fc41f3cb6f309..13124f1750e4ef3a77e4852196772c5f2cf2bbf6 100644 (file)
@@ -46,6 +46,9 @@ static void missed_ticks(struct periodic_time *pt)
 {
     s_time_t missed_ticks;
 
+    if ( unlikely(pt->one_shot) )
+        return;
+
     missed_ticks = NOW() - pt->scheduled;
     if ( missed_ticks <= 0 )
         return;
@@ -111,12 +114,18 @@ static void pt_timer_fn(void *data)
     pt_lock(pt);
 
     pt->pending_intr_nr++;
-    pt->scheduled += pt->period;
 
-    missed_ticks(pt);
-
-    if ( !pt->one_shot )
+    if ( unlikely(pt->one_shot) )
+    {
+        pt->enabled = 0;
+        list_del(&pt->list);
+    }
+    else
+    {
+        pt->scheduled += pt->period;
+        missed_ticks(pt);
         set_timer(&pt->timer, pt->scheduled);
+    }
 
     vcpu_kick(pt->vcpu);